django |
您所在的位置:网站首页 › django filterQ › django |
过滤组件django-filter 官方文档:https://django-filter.readthedocs.io/en/main/ 1 安装 pip install django-filter在django配置文件中注册app INSTALLED_APPS = [ ... 'django_filters', # 需要注册应用, ]环境需求: Python: 3.6, 3.7, 3.8 Django: 2.2, 3.1, 3.2 DRF: 3.10+ 2 使用给出一个模型表: from django.db import models class Product(models.Model): name = models.CharField(max_length=255) price = models.DecimalField(max_digits=5, decimal_places=2) description = models.TextField() release_date = models.DateField() manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)模型表有很多字段,我们想按照价格和日期排序,可以这样做 import django_filters # 导入模块 class ProductFilter(django_filters.FilterSet): name = django_filters.CharFilter(lookup_expr='iexact') class Meta: model = Product fields = ['price', 'release_date']django-filter支持跨表操作,也可以使用双下划线查询,这样会使过滤类显得很冗长,但是保持了最大的自定义程度: class ProductFilter(django_filters.FilterSet): price = django_filters.NumberFilter() price__gt = django_filters.NumberFilter(field_name='price', lookup_expr='gt') price__lt = django_filters.NumberFilter(field_name='price', lookup_expr='lt') release_year = django_filters.NumberFilter(field_name='release_date', lookup_expr='year') release_year__gt = django_filters.NumberFilter(field_name='release_date', lookup_expr='year__gt') release_year__lt = django_filters.NumberFilter(field_name='release_date', lookup_expr='year__lt') manufacturer__name = django_filters.CharFilter(lookup_expr='icontains') class Meta: model = Product fields = ['price', 'release_date', 'manufacturer']过滤器有两个主要参数: field_name:字段名称,你可以使用django中的双下划线查询语法来使用 lookup_expr:过滤时的过滤条件,支持双下划线语法有关双下划线查询,详见这里 字段field_name和lookup_expr一起表示一个完整的Django查找表达式。比如price__gt = django_filters.NumberFilter(field_name='price', lookup_expr='gt')定义之后,浏览器get请求携带参数price__gt=10,就会根据price字段过滤出符合条件价格大于10的数据。 在Meta类中,model指定要过滤的模型表,fields指定通过哪些字段来过滤。此外,可以使用字典为每个字段指定多个查找表达式: import django_filters class ProductFilter(django_filters.FilterSet): class Meta: model = Product fields = { 'price': ['lt', 'gt'], 'release_date': ['exact', 'year__gt'], }如果包含外键字段,同样可以使用双下划线语法: class ProductFilter(django_filters.FilterSet): class Meta: model = Product fields = ['manufacturer__country'] 3 drf中使用在drf中使用过滤: from django_filters import rest_framework as filters # 导入并继承FilterSet类 class ProductFilter(filters.FilterSet): ...你的视图类还需要将DjangoFilterBackend添加到filter_backend中(局部配置) from django_filters import rest_framework as filters class ProductList(generics.ListAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer filter_backends = (filters.DjangoFilterBackend,) # 配置filter_backends filterset_fields = ('category', 'in_stock')全局配置: REST_FRAMEWORK = { # 全局配置 ... 'DEFAULT_FILTER_BACKENDS': ( 'django_filters.rest_framework.DjangoFilterBackend', ), }要使用FilterSet过滤,需要将其添加到视图类的filterset_class参数中。 from rest_framework import generics from django_filters import rest_framework as filters from myapp import Product # 定义过滤类 class ProductFilter(filters.FilterSet): min_price = filters.NumberFilter(field_name="price", lookup_expr='gte') max_price = filters.NumberFilter(field_name="price", lookup_expr='lte') class Meta: model = Product fields = ['category', 'in_stock'] # 在Meta中指定过滤哪些字段 class ProductList(generics.ListAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer filter_backends = (filters.DjangoFilterBackend,) filterset_class = ProductFilter # 在filterset_class中,指定要使用的过滤类由于支持双下划线语法,就可以在过滤类中创建区间过滤。比如ProductFilter中可以定义min_price和max_price,前端传入最小价格和最大价格就可以过滤出相应字段。 本文来自博客园,作者:yyyz,转载请注明原文链接:https://www.cnblogs.com/yyyzyyyz/p/15533452.html |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |